#ifndef _MODBUS_H_
#define _MODBUS_H_
#include "cJSON.h"
#include "list.h"
#include "shmem.h"
#include "msg_queue_peer.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <modbus.h>
#include <sys/shm.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/msg.h>

//缓存链表结构体(便于快速查找以及减少重复解析)
struct mb_node
{
	int key;  //唯一键值
	char name[128];  //数据点名称
	int type;  //数据点类型
    int addr;  //modbus地址，根据设备类型选择
    struct list_head list;  //指针域
};

union val_t
{ 
    int b_val;  //bool类型存储空间
    int i_val;   //整形值存储空间
    float f_val;  //浮点值存储空间
};

//共享内存结构体(用于存储传感器采集数据)
struct std_node
{
	int key;  //唯一键值
	int type;  //数据点类型
    int dev_type;  //数据点属于哪个设备，根据网关支持的设备自行定义
	union val_t old_val;  //变化上报后需要更新旧值
    union val_t new_val;  //从共享内存取出最新数据，放到new_val中
    int ret;  //默认为-1，采集成功后设置为0，采集失败再置-1
};

// 消息队列结构体(用于指令控制)
struct control 
{
    long dev_type;    //数据点属于哪个设备，根据网关支持的设备自行定义    
    int key;       //唯一键值
    union val_t val;   //写入寄存器的数据   
};

int parse_modbus_config(void); 
modbus_t* init_modbus_tcp_connection(const char* ip_address, int port, int slave_id);
void *collect(void *arg); 
void *control(void *arg);
int read_modbus_data(struct mb_node *node, union val_t *data); 
int write_modbus_data(struct mb_node *node, union val_t *data);

#endif // _MODBUS_H_